﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ControlsLib;
using GestionePolveriLib.BL;
using GestionePolveri2.Filters;
using GestionePolveriLib.BL.Filters;
using FrameworkLib.Filters;
using GestionePolveri2.DAL;
using GestionePolveriLib.Facades;
using FrameworkLib.Configurations.FormsConfiguration.BL;
using FrameworkLib.Configurations.FormsConfiguration;
using BrightIdeasSoftware;

namespace GestionePolveri2
{
    public partial class ElencoPrenotazioni : ElencoPrenotazioniBase
    {
        private Polvere m_polvere = null;
        private Operatore m_operatore = null;
        private bool m_canCancelAll = true;

        public Polvere Polvere
        {
            get { return m_polvere; }
            set { m_polvere = value; }
        }

        public ElencoPrenotazioni()
        {
            InitializeComponent();
        }

        public override void InitializeForm()
        {
            OperatoriFacade opf = new OperatoriFacade();
            m_operatore = opf.GetOperatore(this.Principal.Identity.Name);

            string[] roles = System.Web.Security.Roles.GetRolesForUser(this.Principal.Identity.Name);

            SavingConfigurationBag scb = new SavingConfigurationBag();
            scb.FormName = this.Name;
            scb.RoleName = roles[0];
            this.SavingConfigurationBag = scb;

            base.InitializeForm();

            this.CanModify = false;
            this.ShowOnlyCustomButton = true;
            this.ShowCNFGMenu = true;

            this.AddCustomButton("btnAnnullaPrenotazione", "Annulla Prenotazione");
            //this.AddCustomButton("btnExport", "Esporta in Excel");

            this.ButtonClicked += new EventHandler<CustomEventArgs<Prenotazione>>(Form_ButtonClicked);
            this.CustomButtonClicked += new EventHandler<CustomEventArgs<Prenotazione>>(Form_CustomButtonClicked);

            this.ItemSelected += new EventHandler<CustomEventArgs<Prenotazione>>(Form_ItemSelected);

            this.objectListView1.ItemCheck += new ItemCheckEventHandler(objectListView1_ItemCheck);
            this.objectListView1.ItemChecked += new ItemCheckedEventHandler(objectListView1_ItemChecked);

            this.InitializeButtonBar();

            // forziamo la form ad aprirsi con un filtro impostato...
            this.IsFiltering = true;
            this.Filter.FilterBag.Status = PrenotazioneStatus.NonAnnullate;
            this.Filter.UseDatesFilter = false;
            //if (!m_operatore.IsInRole("Amministrazione"))
            //{
            //    this.Filter.FilterBag.Operatore = m_operatore.Identity.Name;
            //}

            if (m_polvere != null)
            {
                this.Filter.FilterBag.CodicePolvere = m_polvere.CodicePolvere;
            }

            this.EnableButton("btnSalva", false);
            this.EnableButton("btnAnnulla", false);

            if ((!this.Principal.IsInRole("Amministrazione")) && (!this.Principal.IsInRole("Verniciatura")))
            {
                this.EnableButton("btnAnnullaPrenotazione", false);
                m_canCancelAll = false;
            }

            ManageData();
        }

        void Form_ButtonClicked(object sender, CustomEventArgs<Prenotazione> e)
        {
            switch (e.Action)
            {
                case Actions.New:
                    {
                    }
                    break;
                case Actions.Add:
                    {
                    }
                    break;
                case Actions.Modify:
                    {
                    }
                    break;
                case Actions.Delete:
                    {
                    }
                    break;
                default:
                    break;
            }
        }

        void Form_CustomButtonClicked(object sender, CustomEventArgs<Prenotazione> e)
        {
            if (e.ButtonName.Equals("btnAnnullaPrenotazione", StringComparison.InvariantCultureIgnoreCase))
            {
                try
                {
                    PrenotazioniFacade pf = new PrenotazioniFacade();
                    bool m_annulloPrenotazioneEffettuato = false;

                    foreach (Prenotazione p in this.objectListView1.CheckedObjects)
                    {
                        // consento l'annullo solo per le prenotazione dell'utente corrente...
                        if ((!this.Principal.IsInRole("Amministrazione") && (!this.Principal.IsInRole("Verniciatura"))))
                        {
                            if (p.IDOperatore == m_operatore.ID)
                            {
                                m_annulloPrenotazioneEffettuato = true;
                            }
                        }
                        else
                        {
                            m_annulloPrenotazioneEffettuato = true;
                        }

                        if (m_annulloPrenotazioneEffettuato)
                        {
                            p.IDOperatoreAnnullo = m_operatore.ID;
                            p.OperatoreNameAnnullo = m_operatore.UserName;
                            p.DataAnnullo = DateTime.Now;
                            p.NoteAnnullo = string.Format("Prenotazione annullata da {0} in data {1}", p.OperatoreNameAnnullo, p.DataAnnullo);
                            pf.AnnullaPrenotazione(p);
                        }
                    }

                    ManageData();

                    if (m_annulloPrenotazioneEffettuato)
                    {
                        MessageBox.Show("Prenotazioni Annullate", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        MessageBox.Show("Nessuna Prenotazioni Annullata.\nE' possibile annullare solo le proprie prenotazioni !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }

                    if (!m_canCancelAll)
                    {
                        this.EnableButton("btnAnnullaPrenotazione", false);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Annullo Prenotazioni Fallita !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    throw ex;
                }
            }
        }

        void objectListView1_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if (!m_canCancelAll)
            {
                if (this.objectListView1.CheckedItems.Count > 0)
                {
                    this.objectListView1.ItemCheck -= new ItemCheckEventHandler(objectListView1_ItemCheck);
                    this.objectListView1.CheckedObjects = null;
                    this.objectListView1.ItemCheck += new ItemCheckEventHandler(objectListView1_ItemCheck);
                }
            }
        }

        void objectListView1_ItemChecked(object sender, ItemCheckedEventArgs e)
        {
            if (!m_canCancelAll)
            {
                Prenotazione m_prenotazione = ((Prenotazione)((OLVListItem)e.Item).RowObject);

                if (m_prenotazione.IDOperatore == m_operatore.ID)
                {
                    this.EnableButton("btnAnnullaPrenotazione", true);
                }
                else
                {
                    this.EnableButton("btnAnnullaPrenotazione", false);
                }
            }
        }

        void Form_ItemSelected(object sender, CustomEventArgs<Prenotazione> e)
        {
            base.Current = e.Item;
        }

        public override void OnRefreshFilterData()
        {
            base.OnRefreshFilterData();

            this.objectListView1.Unsort();

            ManageData();
        }

        public override void OnFilterReset()
        {
            base.OnFilterReset();

            this.IsFiltering = false;

            this.objectListView1.Unsort();

            ManageData();
        }

        public override void OnFilterExecuted()
        {
            base.OnFilterExecuted();

            this.IsFiltering = true;

            this.objectListView1.Unsort();

            ManageData();
        }

        private new void ManageData()
        {
            SuspendLayout1();

            LoadData(this.Filter.FilterBag);

            ResumeLayout1();
        }

        private void ResumeLayout1()
        {
            this.groupBox1.ResumeLayout(false);
            this.groupBox2.ResumeLayout(false);
            this.groupBox2.PerformLayout();
            ((System.ComponentModel.ISupportInitialize)(this.objectListView1)).EndInit();
            this.splitContainer1.Panel1.ResumeLayout(false);
            this.splitContainer1.Panel2.ResumeLayout(false);
            ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
            this.splitContainer1.ResumeLayout(false);
            this.ResumeLayout(false);
        }

        private void SuspendLayout1()
        {
            this.groupBox1.SuspendLayout();
            this.groupBox2.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.objectListView1)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
            this.splitContainer1.Panel1.SuspendLayout();
            this.splitContainer1.Panel2.SuspendLayout();
            this.splitContainer1.SuspendLayout();
            this.SuspendLayout();
        }

        private void LoadData(FilterBase<Prenotazioni> filter)
        {
            //SplashPage sp = new SplashPage();
            //sp.Text = "Caricamento in corso...";
            //sp.ShowDialog();

            PrenotazioniFacade pf = new PrenotazioniFacade();
            pf.RunAsync<List<Prenotazione>>(() => pf.Get(filter, this.Filter.FilterBag), (result) =>
            {
                if (this.IsDisposed) return;

                if (result != null)
                {
                    this.objectListView1.SetObjects((List<Prenotazione>)result);

                    //sp.Close();
                }
                else
                {
                    //sp.Close();

                    this.objectListView1.Items.Clear();
                    this.objectListView1.EmptyListMsg = "Nessun Dato Trovato !";

                    this.ResetButtons();
                    this.ClearControls(this.Controls);

                    this.objectListView1.Items.Clear();
                }
            });
        }
    }

    public class ElencoPrenotazioniBase : AnagraficaManagerFilteredObjectListView<Prenotazione, ElencoPrenotazioniFilter, ElencoPrenotazioniFilterBag> { }
}
